package pe.com.bbva.configuracion.action;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import pe.com.bbva.configuracion.bo.ConfArchivoBO;
import pe.com.bbva.configuracion.bo.ConfiguracionBO;
import pe.com.bbva.configuracion.bo.TipoArchivoBO;
import pe.com.bbva.configuracion.bo.TurnoBO;
import pe.com.bbva.configuracion.domain.ConfArchivo;
import pe.com.bbva.configuracion.domain.Configuracion;
import pe.com.bbva.configuracion.domain.Turno;
import pe.com.bbva.mantenimiento.bo.TablaBO;
import pe.com.bbva.mantenimiento.domain.Tabla;
import pe.com.bbva.targps.bo.UpdateQuartzBO;
import pe.com.bbva.util.Constantes;
import pe.com.stefanini.core.action.GenericAction;
import pe.com.stefanini.core.domain.UsuarioSession;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.StringUtil;

@Service("turnoAction")
@Scope("prototype")
@Results({
	@Result(name="viewListTurno",type="tiles", location="viewListTurno"),
	@Result(name="viewFormTurno",type="tiles", location="viewFormTurno"),
	@Result(name="listaTurnos",type="json",params={"root","grid"})
})
public class TurnoAction extends GenericAction {
	private static final long serialVersionUID = 1L;
	private Logger logger = Logger.getLogger(this.getClass());

	@Resource
	private TurnoBO turnoBO;
	
	@Resource
	private TablaBO tablaBO;
	
	@Resource
	private ConfArchivoBO confArchivoBO;

	@Resource
	private UpdateQuartzBO updateQuartzBO;
	
	@Resource
	private ConfiguracionBO configuracionBO;
	
	@Resource
	private TipoArchivoBO tipoArchivoBO;
	
	private Long idTurno;
	private String seleccionados;
	private String obligatorios;
	
	private Turno turno;
	private Turno turnoBuscar;
	private List<Turno> listaTurnos;

	public void cleanForm() {
		setIdTurno(null);
		setTurno(null);
		setTurnoBuscar(null);
		setSeleccionados(null);
		setObligatorios(null);
	}
	
	@Action(value="initConfTurnos")
	public String init() {
		turno = new Turno();
		return "viewListTurno";
	}
	
	@Action(value="findAllTurno")
	public String findAll() {
		try {
			if (turnoBuscar == null) {
				turnoBuscar = new Turno();
			}
			setGrid(turnoBO.findToGrid(turnoBuscar,getSidx()+" "+getSord(),getPage(),getRows()));
			if(getGrid().getRecords().equals(new Integer(0))){
				addActionError("No se encontraron resultados");
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listaTurnos";
	}

	@Action(value="newTurno")
	public String newForm() {
		return "viewFormTurno";
	}
	
	@Action(value="findAllArchivo")
	public String findAllFile() {
		try {
			List<ConfArchivo> archivos = new ArrayList<ConfArchivo>();
			if(idTurno!=null){
				ConfArchivo confArchivo = new ConfArchivo();
				confArchivo.setTurno(turnoBO.findById(idTurno));
				archivos = confArchivoBO.findConfArchivo(confArchivo);
			}
			setGrid(tipoArchivoBO.findToGridArchivo(archivos, getSidx()+" "+getSord(),getPage(),getRows()));
			if(getGrid().getRecords().equals(new Integer(0))){
				addActionError("No se encontraron resultados");
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listaTurnos";
	}
	
	@Action(value="updateTurno")
	public String updateForm() {
		try {
			turno = turnoBO.findById(idTurno);
			setIdTurno(idTurno);
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewFormTurno";
	}

	@Action(value="deleteTurno")
	public String delete() {
		try {
			turnoBO.deleteLog(Turno.class, idTurno);
			addActionMessage("Eliminado Correctamente.");
		} catch (BOException e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewListTurno";
	}

	@Action(value="saveTurno")
	public String save() {
		String forward = "viewFormTurno";
		String mensaje = "";
		try {
			UsuarioSession usuarioSession = (UsuarioSession) getObjectSession(Constantes.USUARIO_SESSION);
			setCamposAuditoria(turno, usuarioSession);
			String listaObligados[] = seleccionados.split(Pattern.quote("|"));
			Long cantidad = (long)listaObligados.length - 1L;
			turno.setArchivo(cantidad);
			turno.setEstadoEjecucion(Constantes.ESTADO_INACTIVO);
			turnoBO.save(turno, idTurno);
			List<Tabla> equipos = tablaBO.findHijos(Constantes.ID_TABLA_TIPO_ARCHIVO);
			if(idTurno==null){
				for(Tabla equipo: equipos){
					ConfArchivo configuracion = new ConfArchivo();
					configuracion.setEquipo(equipo);
					configuracion.setTurno(turno);
					String codigo = "|"+equipo.getCodigo()+"|";
					if(seleccionados.indexOf(codigo)!=-1){
						configuracion.setEstado(Constantes.ESTADO_ACTIVO);
						if(obligatorios.indexOf(codigo)!=-1){
							configuracion.setObligatorio(Constantes.ESTADO_ACTIVO);
						}else{
							configuracion.setObligatorio(Constantes.ESTADO_INACTIVO);
						}
					}else{
						configuracion.setEstado(Constantes.ESTADO_INACTIVO);
						configuracion.setObligatorio(Constantes.ESTADO_INACTIVO);
					}
					confArchivoBO.save(configuracion);
				}
				mensaje = "Registrado Correctamente";
			}else{
				ConfArchivo buscar = new ConfArchivo();
				buscar.setTurno(turno);
				List<ConfArchivo> configuraciones = confArchivoBO.findConfArchivo(buscar);
				for(ConfArchivo configuracion: configuraciones){
					String codigo = "|"+configuracion.getEquipo().getCodigo()+"|";
					if(seleccionados.indexOf(codigo)!=-1){
						configuracion.setEstado(Constantes.ESTADO_ACTIVO);
						if(obligatorios.indexOf(codigo)!=-1){
							configuracion.setObligatorio(Constantes.ESTADO_ACTIVO);
						}else{
							configuracion.setObligatorio(Constantes.ESTADO_INACTIVO);
						}
					}else{
						configuracion.setEstado(Constantes.ESTADO_INACTIVO);
						configuracion.setObligatorio(Constantes.ESTADO_INACTIVO);
					}
					confArchivoBO.save(configuracion);
				}
				mensaje = "Actualizado Correctamente";
			}
			Configuracion configCarga = configuracionBO.findById(Constantes.ID_CONFIG_CARGA);
			updateQuartzBO.actualizarConfiguracionQuartz(configCarga, null, false);
			addActionMessage(mensaje);
			cleanForm();
			forward = "viewListTurno";
		} catch (BOException e) {
			if(idTurno!=null){
				try {
					Turno turnoTmp = turnoBO.findById(Long.valueOf(idTurno));
					if(turnoTmp!=null)
						turnoBO.delete(turnoTmp);
				} catch (BOException e1) {
					forward = "viewFormTurno";
					addActionError(e.getMessage());
					logger.error(StringUtil.getStackTrace(e));
				} catch (DAOException e1) {
					forward = "viewFormTurno";
					addActionError(e.getMessage());
					logger.error(StringUtil.getStackTrace(e));
				}
			}
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			if(idTurno!=null){
				try {
					Turno turnoTmp = turnoBO.findById(Long.valueOf(idTurno));
					if(turnoTmp!=null)
						turnoBO.delete(turnoTmp);
				} catch (BOException e1) {
					addActionError(e.getMessage());
					logger.error(StringUtil.getStackTrace(e));
				} catch (DAOException e1) {
					addActionError(e.getMessage());
					logger.error(StringUtil.getStackTrace(e));
				}
			}
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		}
		return forward;
	}

	public Long getIdTurno() {
		return idTurno;
	}

	public void setIdTurno(Long idTurno) {
		this.idTurno = idTurno;
	}

	public Turno getTurno() {
		return turno;
	}

	public void setTurno(Turno turno) {
		this.turno = turno;
	}

	public Turno getTurnoBuscar() {
		return turnoBuscar;
	}

	public void setTurnoBuscar(Turno turnoBuscar) {
		this.turnoBuscar = turnoBuscar;
	}

	public List<Turno> getListaTurnos() {
		return listaTurnos;
	}

	public void setListaTurnos(List<Turno> listaTurnos) {
		this.listaTurnos = listaTurnos;
	}

	public void setSeleccionados(String seleccionados) {
		this.seleccionados = seleccionados;
	}

	public String getSeleccionados() {
		return seleccionados;
	}

	public String getObligatorios() {
		return obligatorios;
	}
	
	public void setObligatorios(String obligatorios) {
		this.obligatorios = obligatorios;
	}
}